 /* Secao das declaracoes */

%option noyywrap
  /* Sera copiado no .c final */
%{
    #include <stdlib.h>
    #include <string.h>
   
    /* estes includes sao importantes... */
    #include "lista.h"
    #include "node.h"
    #include "tokens.h"

    /*variaveis*/
    int VAL_INT;
    double VAL_DOUBLE = 0;
    int VAL_INT=0;
  
%}
 
  /* Definicoes regulares (A COMPLETAR conforme se quer) */
digito		[0-9]
letra		[a-zA-Z]


%%

 /* Secao das Regras de traducao */
 /* O que consta aqui eh puramente ilustrativo... A COMPLETAR ! 
  * Ver tambem "tokens.h".
  */
 /*tokens simples*/

int		{ return(INT); }
double  { return(DOUBLE);}
real   { return(REAL);}
char    { return(CHAR);}
"+"		{ return('+');}
"-"		{ return('-');}
"/"		{ return('/');}
"*"		{ return('*');}
","		{ return(',');}
";"		{ return(';');}
":"		{ return(':');}
"'"		{ return(QUOTE);}
"\""	{ return(DQUOTE);}
"("		{ return('(');}
")"		{ return(')');}
"{"		{ return('{');}
"}"		{ return('}');}
"["		{ return('[');}
"]"		{ return(']');}
"<"		{ return('<');}
">"		{ return('>');}
"="		{ return('=');}
"<="    { return(LE);}
">="    { return(GE);}
"=="    { return(EQ);}
"!="    { return(NE);}
"&&"    { return(AND);}
"||"    { return(OR);}
"!"		{ return(NOT);}
"if"	{ return(IF);}
"then"	{ return(THEN);}
"else"	{ return(ELSE);}
"while"	{ return(WHILE);}
"end"	{ return(END);}
"true"	{ return(TRUE);}
"false"	{ return(FALSE);}
"print"	{ return(PRINTF);}

[ \n\t]+ { }

{digito}+ {
    yylval.cadeia = malloc(sizeof(char)*(strlen(yytext) + 1));
    strcpy(yylval.cadeia,yytext);
    return( INT_LIT );
    }

{digito}*\.{digito}+([eE][-+]{digito}+)? {
    yylval.cadeia = malloc(sizeof(char)*(strlen(yytext) + 1));    
    strcpy(yylval.cadeia,yytext);
    return( F_LIT );
    }

{letra}({letra}|{digito}|_)* {

    yylval.cadeia = malloc(sizeof(char)*(strlen(yytext) + 1));
    strcpy(yylval.cadeia,yytext);
    return IDF;
    }

. { printf("Erro lexical - caractere nao reconhecido: %c.\n", yytext[0]);
    exit(-1); }
